
# 装饰器
"""
说明 ：
1. 在函数的内部又定义了一个函数
2. 内部函数使用了外部函数的临时变量
3. 外部函数的返回值是内部函数的引用


# 语法：
def outer_func():
    temp = None
    def inner_func():       # ①
        print(temp)         # ②
        代码块
    return inner_func       # ③


闭包的主要使用场景 ： 装饰器 。
"""

# 需求 ： 实现加、减、乘、除的简易版计算器
import  operator

def operation(func):
    def calc(a,b,c):
        vls = {
            '+':operator.add(a,b),
            '-':operator.sub(a,b),
            '*':operator.mul(a,b),
            '/':operator.truediv(a,b)
        }
        result = vls.get(c)
        return func(a,b,result)
    return calc


# 实现一个打印函数 ，希望能打印具体计算操作
@operation
def show(x,y,z):
    print("{} + {} = {}".format(x,y,z))


show(3,4,'+')


"""
1. 对于装饰器来说，它具有加减乘除的功能 
2. 对于show函数来说，希望直接使用装饰器 ，@装饰器名

原理 ：
1. show(3,4,'+') 函数作为参数传递给了装饰器
2. 将装饰器的返回结果返回到使用者

装饰器 ： 只需要知道如何去调用装饰器 ，就是在函数名前加上@装饰器名。
"""
